package com.tool.cn.use.search.map;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.tool.cn.util.CollectionUtil;
import com.tool.cn.util.IpUtil;
import com.tool.cn.util.StringUtil;

/**
 * 
 * @author wangzonghui
 * @date 2022年4月26日 上午10:40:50 
 * @Description 精确模糊混合查询
 */
public class EqualContainsMap {

	private final Logger log = LoggerFactory.getLogger(this.getClass());

	/**
	 * 精确map
	 */
	private Map<String,List<String>> equalMap=new Hashtable<>();
	/**
	 * 模糊map
	 */
	private Map<String,List<String>> containsMap=new Hashtable<>();
	
	private Map<String,String> recordMap=new Hashtable<>();
	
	
	/**
	 * 添加数据
	 * @param equal 精确信息
	 * @param ipMask ip掩码位
	 * @param data 数据
	 * @return
	 */
	public boolean add(String equal,String ipMask, String data) {
		try {
			List<String> tmpList;
			
			if(containsMap.containsKey(ipMask)) {
				tmpList=containsMap.get(ipMask);
			}else {
				tmpList=new ArrayList<>();
			}
			
			if(!tmpList.contains(data)) {
				tmpList.add(data);
				containsMap.put(ipMask, tmpList);
				
				if(StringUtil.isNotEmpty(equal)) {
					//添加数据
					if(equalMap.containsKey(equal)) {
						tmpList=equalMap.get(equal);
					}else {
						tmpList=new ArrayList<>();
					}
					
					if(!tmpList.contains(ipMask)) {
						tmpList.add(ipMask);
						equalMap.put(equal, tmpList);
					}
					
					//添加记录
					recordMap.put(data, equal+StringUtil.line+ipMask);

				}else {
					recordMap.put(data, ipMask);
				}
			}else {
				log.error("Key:{} Data {} Have Map",ipMask,data);
			}
			
			
		} catch (Exception e) {
			log.error("Add Equal {} ipMask:{}  Of Data:{} Error",equal,ipMask,data);
			return false;
		}
		return true;
	}

	/**
	 * 删除数据
	 * @param equal 精确信息
	 * @param ipMask ip掩码位
	 * @param data 数据
	 * @return
	 */
	public boolean remove(String equal,String ipMask,String data) {
		try {
			List<String> tmpList;
			
			if(containsMap.containsKey(ipMask)) {
				tmpList=containsMap.get(ipMask);
				if(tmpList.removeIf(e -> e.equals(data))) {
					
					if(tmpList.size()>0) {
						containsMap.put(ipMask, tmpList);
					}else {
						containsMap.remove(ipMask);
						
						if(StringUtil.isNotEmpty(equal)) {
							if(equalMap.containsKey(equal)) {
								tmpList=equalMap.get(equal);
								if(tmpList.removeIf(e -> e.equals(ipMask))) {
									
									if(tmpList.size()>0) {
										equalMap.put(equal, tmpList);
									}else {
										equalMap.remove(equal);
									}
								}
							}
						}
					}
				}
			}

			//删除记录
			recordMap.remove(data);
			
		} catch (Exception e) {
			log.error("Remove Equal {} ipMask:{}  Of Data:{} Error",equal,ipMask,data);
			return false;
		}
		return true;
	}
	
	/**
	 * 删除数据
	 * @param data
	 * @return
	 */
	public boolean remove(String data) {
		if(recordMap.containsKey(data)) {
			String key=recordMap.get(data);
			if(key.contains(StringUtil.line)) {
				String[] tmp=key.split("\\"+StringUtil.line);
				return remove(tmp[0], tmp[1], data);
			}else {
				return remove("", key, data);
			}
		}
		return true;
	}

	/**
	 * 搜索数据
	 * @param equal 精确信息
	 * @param ip ip地址
	 * @return
	 */
	public List<String> search(String equal,String ip) {
		
		List<String> dataList=new ArrayList<>();
		List<String> dataTmpList;
		List<String> tmpList;
		
		if(StringUtil.isNotEmpty(equal)) {
			if(equalMap.containsKey(equal)) {
				tmpList=equalMap.get(equal);
				for (String one:tmpList) {

					if(IpUtil.checkIp(one, ip)) {  //验证ip是否满足掩码ip
						dataTmpList=containsMap.get(one);
						if(CollectionUtil.isNotEmptyCollection(dataTmpList)) {
							dataList.addAll(dataTmpList);
						}
					}
				}
			}
			
		}else {
			for(String one:containsMap.keySet()) {
				if(IpUtil.checkIp(one, ip)) {  //验证ip是否满足掩码ip
					dataTmpList=containsMap.get(one);
					if(CollectionUtil.isNotEmptyCollection(dataTmpList)) {
						dataList.addAll(dataTmpList);
					}
				}
			}
		}
		
		return dataList;
	}
	
	@Override
	public String toString() {
		if(containsMap.size()>0) {
			return StringUtil.mapToString(equalMap)+" "+StringUtil.mapToString(containsMap);
		}
		return "";
	}
	
}
